/**
 * PanelDocenteImparte.java
 */

 /**
 *  AdSec: Administrador de Secundarias
 *  Copyright (C) 2009 Daniela Ramírez Chaves (dannyrch@gmail.com)
 *  Copyright (C) 2009 Leonel Salazar Valverde (leo87sv@gmail.com)
 *
 *  This file is part of AdSec.
 *  AdSec is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  AdSec is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with AdSec.  If not, see <http://www.gnu.org/licenses/>.
 */

package adsec.presentacion;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListModel;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import adsec.entidades.Anio;
import adsec.entidades.Docente;
import adsec.entidades.Estado;
import adsec.entidades.MateriaCursada;
import adsec.entidades.MateriaImpartida;
import adsec.entidades.Nivel;
import adsec.entidades.Permiso;
import adsec.entidades.Seccion;
import adsec.negocios.AdministradorSeguridad;
import adsec.negocios.ControladoraDocenteImparte;
import adsec.negocios.UtilidadesCapaNegocios;
import org.jdesktop.application.Action;


public class PanelDocenteImparte extends javax.swing.JPanel implements ListSelectionListener, ActionListener {

    private AdministradorSeguridad adminSeguridad;
    private ControladoraDocenteImparte contDocenteImparte;
    private Permiso permiso;
    private Estado estado;
    private LinkedList<Seccion> seccionesDisponibles;
    private LinkedList<Seccion> seccionesImpartir;
    private LinkedList<MateriaCursada> materiasDisponibles;
    private LinkedList<MateriaImpartida> materiasImpartir;
    private final int columnaBorrar = 0;
    private int tamañoLista;

    /** Creates new form PanelNivelSeccion */
    public PanelDocenteImparte() {
        initComponents();
        this.iniciarPanelDocenteImparte();
    }

    public void iniciarPanelDocenteImparte(){
        this.adminSeguridad = AdministradorSeguridad.getInstancia();
        this.permiso = adminSeguridad.getPermiso(UtilidadesCapaNegocios.moduloDocenteImparte);
        this.estado = new Estado();
        this.contDocenteImparte = new ControladoraDocenteImparte();
        this.seccionesDisponibles = new LinkedList<Seccion>();
        this.seccionesImpartir = new LinkedList<Seccion>();
        this.materiasDisponibles = new LinkedList<MateriaCursada>();
        this.materiasImpartir = new LinkedList<MateriaImpartida>();
        this.habilitarBotonesAE(permiso.isInsertar() || permiso.isModificar(), permiso.isEliminar());
        this.habilitarAceptarCancelar(false);
        this.habilitarBotonesControl(false);
        this.habilitarComboBoxBasicos(this.permiso.isConsultar());
        this.habilitarNivelesMaterias(false);
        if(this.permiso.isConsultar()){
            this.cargarDatosBasicos();
        }
        this.tamañoLista = 0;
    }//fin de iniciarPanelDocenteImparte

    /**
     ** Habilita o deshabilita los botones actualizar y eliminar
     **/
    private void habilitarBotonesAE(boolean actualizar, boolean eliminar){
        this.btnActualizar.setEnabled(actualizar);
        this.btnEliminar.setEnabled(eliminar);
    }

    /**
     ** Habilita o deshabilita los botones aceptar y cancelar
     **/
    private void habilitarAceptarCancelar(boolean habilitar){
        this.btnAceptar.setEnabled(habilitar);
        this.btnCancelar.setEnabled(habilitar);
    }

    private void habilitarBotonesControl(boolean habilitar){
        this.habilitarBotonesListas(habilitar);
        this.habilitarAgregarBorrar(habilitar);
    }

    /**
     ** Habilita o deshabilita los botones para mover secciones de una lista a otra
     **/
    private void habilitarBotonesListas(boolean habilitar){
        this.btnImpartirUna.setEnabled(habilitar);
        this.btnNoImpartirUna.setEnabled(habilitar);
        this.btnImpartirTodas.setEnabled(habilitar);
        this.btnImpartirNinguna.setEnabled(habilitar);
    }

    /**
     ** Habilita o deshabilita los botones agregar y borrar seleccionados
     **/
    private void habilitarAgregarBorrar(boolean habilitar){
        this.btnAgregarGrid.setEnabled(habilitar);
        this.btnBorrarSeleccionados.setEnabled(habilitar);
    }

    private void habilitarComboBoxBasicos(boolean habilitar){
        this.cbCedula.setEnabled(habilitar);
        this.cbNombreApellidos.setEnabled(habilitar);
        this.cbAño.setEnabled(habilitar);
    }

    private void habilitarNivelesMaterias(boolean habilitar){
        this.cbNivel.setEnabled(habilitar);
        this.cbMaterias.setEnabled(habilitar);
    }

    /**
     ** Limpia todos los campos de la pantalla
     **/
    private void limpiarCampos(){
        this.limpiarComboBoxes();
        this.limpiarListas();
        ((DefaultTableModel)this.gridMateriasSeccionesImpartir.getModel()).setRowCount(0);
    }//fin de limpiarCampos

    private void limpiarComboBoxes(){
        ((DefaultComboBoxModel) this.cbCedula.getModel()).removeAllElements();
        ((DefaultComboBoxModel) this.cbNombreApellidos.getModel()).removeAllElements();
        ((DefaultComboBoxModel) this.cbAño.getModel()).removeAllElements();
        ((DefaultComboBoxModel) this.cbNivel.getModel()).removeAllElements();
        ((DefaultComboBoxModel) this.cbMaterias.getModel()).removeAllElements();
    }//fin de limpiarComboBoxes

    private void limpiarListas(){
        ((DefaultListModel)this.listSeccionesDisponibles.getModel()).removeAllElements();
        ((DefaultListModel)this.listSeccionesImpartir.getModel()).removeAllElements();
        this.seccionesDisponibles.clear();
        this.seccionesImpartir.clear();
        this.materiasImpartir.clear();
        this.materiasDisponibles.clear();
    }//fin de limpiarListas

    /** Limpia el grid, limpia la lista de secciones elegidas,
     ** la lista de secciones disponibles del nivel y recarga la lista
     ** completa en el listBox.
     **/
    private void limpiarSeccionesYGrid(){
        ((DefaultListModel)this.listSeccionesDisponibles.getModel()).removeAllElements();
        ((DefaultListModel)this.listSeccionesImpartir.getModel()).removeAllElements();
        this.seccionesDisponibles.clear();
        this.seccionesImpartir.clear();
        ((DefaultTableModel)this.gridMateriasSeccionesImpartir.getModel()).setRowCount(0);
        this.cargarSecciones();
    }//fin de limpiarSeccionesYGrid

    private void volverConsultar(){
        this.habilitarBotonesControl(false);
        this.habilitarBotonesAE(this.permiso.isInsertar() || this.permiso.isModificar(), this.permiso.isEliminar());
        this.habilitarAceptarCancelar(false);
        this.habilitarNivelesMaterias(false);
        this.cargarDatosBasicos();
    }

    private void cargarDatosBasicos(){
        this.cargarDocentes();
        this.cargarAños();
        this.cargarNiveles();
    }

    /*****************************************
     * CARGA DE DATOS
     *****************************************/

    private void cargarDocentes(){
        LinkedList<Docente> docentes = this.contDocenteImparte.consultarDocentes();
        Iterator<Docente> iterador = docentes.iterator();
        DefaultComboBoxModel modeloCedula = new DefaultComboBoxModel();
        DefaultComboBoxModel modeloNombreApellidos = new DefaultComboBoxModel();
        modeloCedula.addElement("");
        modeloNombreApellidos.addElement("");
        while(iterador.hasNext()){
        Docente docente = iterador.next();
            modeloCedula.addElement(docente.getCedula());
            modeloNombreApellidos.addElement(docente.getNombre() + " " + docente.getApellidos());
        }//fin de while
        this.cbCedula.setModel(modeloCedula);
        this.cbNombreApellidos.setModel(modeloNombreApellidos);
    }//fin de cargarDocentes

    private void cargarAños(){
        ((DefaultComboBoxModel)cbAño.getModel()).removeAllElements();
        LinkedList<Anio> años = this.contDocenteImparte.consultarAños();
        Iterator<Anio> iterador = años.iterator();
        ((DefaultComboBoxModel)this.cbAño.getModel()).addElement("");
        while(iterador.hasNext()){
            String elemento = Integer.toString(iterador.next().getAnio());
            ((DefaultComboBoxModel)this.cbAño.getModel()).addElement(elemento);
        }
    }//fin de cargarAños

    private void cargarNiveles(){
        ((DefaultComboBoxModel)cbNivel.getModel()).removeAllElements();
        LinkedList<Nivel> niveles = this.contDocenteImparte.consultarNivelesTodos();
        Iterator<Nivel> iterador = niveles.iterator();
        ((DefaultComboBoxModel)this.cbNivel.getModel()).addElement("");
        while(iterador.hasNext()){
            String elemento = Integer.toString(iterador.next().getNivel());
            ((DefaultComboBoxModel)this.cbNivel.getModel()).addElement(elemento);
        }
    }//fin de cargarNiveles

    private void cargarSecciones(){
        Object añoSelect = cbAño.getSelectedItem();
        Object nivelSelect = cbNivel.getSelectedItem();
        if(añoSelect != null && nivelSelect != null){
            if(!añoSelect.toString().isEmpty() && !nivelSelect.toString().isEmpty()){
                ((DefaultListModel)this.listSeccionesDisponibles.getModel()).clear();
                Anio año = new Anio();
                Nivel nivel = new Nivel();
                año.setAnio(Integer.parseInt(añoSelect.toString()));
                nivel.setNivel(Integer.parseInt(nivelSelect.toString()));
                this.seccionesDisponibles = this.contDocenteImparte.consultarSecciones(año, nivel);
                Iterator<Seccion> iterador = this.seccionesDisponibles.iterator();
                while(iterador.hasNext()){
                    Seccion sec = iterador.next();
                    String elemento = Integer.toString(sec.getSeccion());
                    ((DefaultListModel)this.listSeccionesDisponibles.getModel()).addElement(elemento);
                }//fin de while
            }//fin de if
        }//fin de if
    }//fin de cargarSecciones

    private void cargarMaterias(){
        Object añoSelect = cbAño.getSelectedItem();
        Object nivelSelect = cbNivel.getSelectedItem();
        if(añoSelect != null && nivelSelect != null){
            if(!añoSelect.toString().isEmpty() && !nivelSelect.toString().isEmpty()){
                DefaultComboBoxModel modelo = (DefaultComboBoxModel)this.cbMaterias.getModel();
                modelo.removeAllElements();
                Anio año = new Anio();
                Nivel nivel = new Nivel();
                año.setAnio(Integer.parseInt(añoSelect.toString()));
                nivel.setNivel(Integer.parseInt(nivelSelect.toString()));
                this.materiasDisponibles = this.contDocenteImparte.consultarMateriasCursadas(año.getAnio(), nivel.getNivel());
                if(this.materiasDisponibles.size() > 0){
                    modelo.addElement("Todas");
                    Iterator<MateriaCursada> iterador = this.materiasDisponibles.iterator();
                    while(iterador.hasNext()){
                        MateriaCursada matCursada = iterador.next();
                        String elemento = matCursada.getNombre();
                        modelo.addElement(elemento);
                    }//fin de while
                }//fin de if
            }//fin de if
        }//fin de if
    }//fin de cargarMaterias

    private void limpiarMateriasSecciones(){
        this.seccionesDisponibles.clear();
        this.seccionesImpartir.clear();
        this.materiasDisponibles.clear();
        ((DefaultListModel)this.listSeccionesDisponibles.getModel()).clear();
        ((DefaultListModel)this.listSeccionesImpartir.getModel()).clear();
        ((DefaultComboBoxModel) this.cbMaterias.getModel()).removeAllElements();
    }//fin de limpiarMateriasSecciones

    private void cargarGridMateriasImparte(){
        if(this.cbCedula.getSelectedIndex() > 0 && this.cbAño.getSelectedIndex() > 0){
           
           this.materiasImpartir = this.contDocenteImparte.consultarMateriasImparte(
                   this.cbCedula.getSelectedItem().toString(), Integer.parseInt(this.cbAño.getSelectedItem().toString()));
           this.tamañoLista = this.materiasImpartir.size();
            DefaultTableModel modelo = (DefaultTableModel)this.gridMateriasSeccionesImpartir.getModel();
            modelo.setRowCount(0);
            Iterator<MateriaImpartida> iterador = this.materiasImpartir.iterator();
            while(iterador.hasNext()){
                MateriaImpartida materiaImpartida = iterador.next();
                Object [] datos = new Object[4];
                datos[0] = false;
                datos[1] = materiaImpartida.getNivel();
                datos[2] = materiaImpartida.getNumSeccion();
                datos[3] = materiaImpartida.getNombre();
                ((DefaultTableModel)this.gridMateriasSeccionesImpartir.getModel()).addRow(datos);
            }//fin de while
        }//fin de if
    }//fin de cargarGridMateriasImparte

    /*****************************************
     * AUXILIARES
     *****************************************/

    private MateriaImpartida obtenerDatosMateriaImpartida(){
        MateriaImpartida materiaImpartida = new MateriaImpartida();
        materiaImpartida.setCedula(this.cbCedula.getSelectedItem().toString());
        materiaImpartida.setAño(Integer.parseInt(this.cbAño.getSelectedItem().toString()));
        materiaImpartida.setNivel(Integer.parseInt(this.cbNivel.getSelectedItem().toString()));
        return materiaImpartida;
    }

    private void agregarAGridTemporal(MateriaImpartida materiaImpartida){
        if( !this.materiasImpartir.contains(materiaImpartida) ){
            this.materiasImpartir.add(materiaImpartida);
            Object [] datos = new Object[4];
            datos[0] = false;
            datos[1] = materiaImpartida.getNivel();
            datos[2] = materiaImpartida.getNumSeccion();
            datos[3] = materiaImpartida.getNombre();
            ((DefaultTableModel)this.gridMateriasSeccionesImpartir.getModel()).addRow(datos);
        }
    }//fin de agregarAGridTemporal

    private boolean validarDatosAgregar(){
        boolean datosValidos = true;
        datosValidos &= cbAño.getSelectedIndex() > 0;
        datosValidos &= cbNivel.getSelectedIndex() > 0;
        datosValidos &= cbMaterias.getSelectedIndex() >= 0;
        datosValidos &= this.listSeccionesImpartir.getModel().getSize() > 0;
        return datosValidos;
    }

    private boolean validarDatosAceptar(){
        boolean datosValidos = true;
        datosValidos &= cbCedula.getSelectedIndex() > 0;
        datosValidos &= cbAño.getSelectedIndex() > 0;
        return datosValidos;
    }

    public boolean hayMateriasNuevas(){
        boolean nuevas = false;
        Iterator<MateriaImpartida> iterador = this.materiasImpartir.iterator();
        while(iterador.hasNext() && !nuevas){
            nuevas = !iterador.next().isImpartida();
        }
        return nuevas || this.materiasImpartir.size() != this.tamañoLista;
    }

    private void limpiarCamposDespuesAgregar(){
        /*((DefaultListModel)this.listSeccionesImpartir.getModel()).clear();
        this.seccionesImpartir.clear();*/
        this.removerTodos();
        Collections.sort(this.seccionesDisponibles);
        ((DefaultListModel)this.listSeccionesDisponibles.getModel()).clear();
        Iterator<Seccion> iterador = this.seccionesDisponibles.iterator();
        while(iterador.hasNext()){
            Seccion sec = iterador.next();
            String elemento = Integer.toString(sec.getSeccion());
            ((DefaultListModel)this.listSeccionesDisponibles.getModel()).addElement(elemento);
        }//fin de while
    }

    /*****************************************
     * ACTUALIZACION DE DATOS
     *****************************************/

    private void actualizarMateriaImpartida(){
        String cedula = this.cbCedula.getSelectedItem().toString();
        int año = Integer.parseInt( this.cbAño.getSelectedItem().toString() );
        int resultado = this.contDocenteImparte.actualizarDocenteImparte(materiasImpartir, cedula, año);
        if(resultado == UtilidadesCapaNegocios.QUERY_OK){
            this.gridMateriasSeccionesImpartir.getSelectionModel().clearSelection();
            JOptionPane.showMessageDialog(null, "La(s) materia(s) y seccion(es) que el docente imparte han sido actualizadas exitosamente");
            this.habilitarAceptarCancelar(false);
            this.habilitarNivelesMaterias(false);
            this.habilitarBotonesControl(false);
            this.tamañoLista = this.materiasImpartir.size();
        }else{
            String mensaje = UtilidadesCapaNegocios.getErrorOperacion(UtilidadesCapaNegocios.moduloDocenteImparte, UtilidadesCapaNegocios.opInsertar);
            JOptionPane.showMessageDialog(null, mensaje, "ERROR",JOptionPane.ERROR_MESSAGE);
        }
    }//fin de actualizarMateriaImpartida

    private void eliminarMateriaImpartida(){
        String cedula = this.cbCedula.getSelectedItem().toString();
        String nombre = this.cbNombreApellidos.getSelectedItem().toString();
        int año = Integer.parseInt( this.cbAño.getSelectedItem().toString() );
        int resultado = this.contDocenteImparte.eliminarDocenteImparte(cedula, año);
        if(resultado == UtilidadesCapaNegocios.QUERY_OK){
            this.gridMateriasSeccionesImpartir.getSelectionModel().clearSelection();
            JOptionPane.showMessageDialog(null, "El docente "+ nombre + " ya no imparte ninguna materia en ninguna sección en el año " + año);
            this.volverConsultar();
        }else{
            String mensaje = UtilidadesCapaNegocios.getErrorOperacion(UtilidadesCapaNegocios.moduloDocenteImparte, UtilidadesCapaNegocios.opEliminar);
            JOptionPane.showMessageDialog(null, mensaje, "ERROR",JOptionPane.ERROR_MESSAGE);
        }
    }//fin de actualizarMateriaImpartida


    /*****************************************
     * EVENTOS
     *****************************************/

    public void actionPerformed(ActionEvent evento){
        
        JComboBox fuente = (JComboBox)evento.getSource();
        boolean encontrado = false;
        if(fuente.equals(this.cbCedula)){
            this.cbNombreApellidos.setSelectedIndex(this.cbCedula.getSelectedIndex());
            encontrado = true;
        }
        if(fuente.equals(this.cbNombreApellidos)){
            this.cbCedula.setSelectedIndex(this.cbNombreApellidos.getSelectedIndex());
            encontrado = true;
        }
        if(encontrado && this.estado.getEstadoActual() == Estado.INSERTAR){
            this.limpiarSeccionesYGrid();
        }//fin de if
        if(!encontrado){
            this.eventoComboBoxNoEstudiante(fuente);
        }
        if(fuente.equals(this.cbAño) || fuente.equals(this.cbCedula)
                || fuente.equals(this.cbNombreApellidos) ){
            this.cargarGridMateriasImparte();
        }
    }//fin de actionPerformed

    private void eventoComboBoxNoEstudiante(JComboBox fuente){
        if(fuente.equals(this.cbNivel) && this.cbAño.getSelectedIndex() > 0){
            if(this.cbNivel.getSelectedIndex() > 0){
                this.cargarSecciones();
                this.cargarMaterias();
            }else{
                this.limpiarMateriasSecciones();
            }
        }//fin de if
        if(fuente.equals(this.cbAño) && this.cbNivel.getSelectedIndex() > 0){
            if(this.cbAño.getSelectedIndex() > 0){
                this.cargarSecciones();
                this.cargarMaterias();
            }else{
                this.limpiarMateriasSecciones();
            }
        }//fin de if
        
    }//fin de eventoComboBoxNoEstudiante

    public void valueChanged(ListSelectionEvent evento){
        
    }//fin de valueChanged

    @Action
    public void actualizandoMateria() {
        this.estado.setEstadoActual(Estado.INSERTAR);
        this.habilitarBotonesControl(true);
        this.habilitarAceptarCancelar(true);
        this.habilitarNivelesMaterias(true);
    }//fin de actualizandoMateria


    @Action
    public void eliminandoMateria() {
        Animador.animar();
        if(this.mostrarMensajeConfirmacion(UtilidadesCapaNegocios.opEliminar, "ELIMINAR")){
            if(this.cbCedula.getSelectedIndex() > 0 && this.cbAño.getSelectedIndex() > 0){
                this.eliminarMateriaImpartida();
                this.limpiarCampos();
                this.volverConsultar();
            }else{
                JOptionPane.showMessageDialog(null, "Debe seleccionar un docente y un año para poder eliminar\n" +
                        "la información de las materias que éste imparte", "ERROR", JOptionPane.ERROR_MESSAGE);
            }
        }
        Animador.detenerAnimacion();
    }//fin de eliminandoMateria

    /**
     ** Muestra un mensaje de confirmación para que el usuario decida si realmente
     ** quiere llevar a cabo una operación
     ** @param operacion Código de operación realizada, tomada de UtilidadesCapaNegocios
     ** @param titulo Título a mostrar en el cuadro de confirmación
     ** @return Confirmación: true si el usuario acepta, false en otro caso.
     **/
    private boolean mostrarMensajeConfirmacion(int operacion,String titulo){
        boolean resultado = true;
        String mensaje = UtilidadesCapaNegocios.getMensajeConfirmacion(UtilidadesCapaNegocios.moduloDocenteImparte, operacion);
        int respuesta = JOptionPane.showConfirmDialog(null, mensaje,titulo ,JOptionPane.YES_NO_OPTION,JOptionPane.WARNING_MESSAGE);
        resultado = respuesta == JOptionPane.OK_OPTION;
        return resultado;
    }//fin de mostrarMensajeConfirmacion

    @Action
    public void accionAgregarGrid(){
        
        if( this.seccionesImpartir.size() > 0 && validarDatosAgregar() ){
            Iterator<Seccion> iteradorSeccion = this.seccionesImpartir.iterator();
            MateriaCursada materiaCursada = null;
            int indiceMateria = this.cbMaterias.getSelectedIndex();

            while(iteradorSeccion.hasNext()){
                MateriaImpartida materiaImpartida = this.obtenerDatosMateriaImpartida();
                materiaImpartida.setNumSeccion(iteradorSeccion.next().getSeccion());
                if( indiceMateria > 0 ){
                    materiaCursada = this.materiasDisponibles.get(indiceMateria-1);
                    materiaImpartida.setNombre(materiaCursada.getNombre());
                    materiaImpartida.setIdMateria(materiaCursada.getIdMateria());
                    materiaImpartida.setIdMateriaCursada(materiaCursada.getIdMateriaCursada());
                    this.agregarAGridTemporal(materiaImpartida);
                }else{
                    Iterator<MateriaCursada> iteradorMateria = this.materiasDisponibles.iterator();
                    while(iteradorMateria.hasNext()){
                        materiaCursada = iteradorMateria.next();
                        materiaImpartida = new MateriaImpartida(materiaImpartida);
                        materiaImpartida.setNombre(materiaCursada.getNombre());
                        materiaImpartida.setIdMateria(materiaCursada.getIdMateria());
                        materiaImpartida.setIdMateriaCursada(materiaCursada.getIdMateriaCursada());
                        this.agregarAGridTemporal(materiaImpartida);
                    }//fin de while
                }//fin de else
            }//fin de while
            this.limpiarCamposDespuesAgregar();
        }//fin de if
    }//fin de accionAgregarGrid

    @Action
    public void accionBorrarGrid(){
        DefaultTableModel modelo = (DefaultTableModel)this.gridMateriasSeccionesImpartir.getModel();
        for(int fila = modelo.getRowCount()-1; fila >= 0; fila--){
            Boolean borrar = (Boolean) modelo.getValueAt(fila, this.columnaBorrar);
            if(borrar.booleanValue()){
                modelo.removeRow(fila);
                this.materiasImpartir.remove(fila);
            }
        }//fin de for
    }//fin de accionBorrarGrid

    @Action
    public void accionAceptar() {        
        Animador.animar();
        if(mostrarMensajeConfirmacion(UtilidadesCapaNegocios.opInsertar, "INSERTAR")){
            if(validarDatosAceptar()){
                if(hayMateriasNuevas()){
                    this.actualizarMateriaImpartida();
                }else{
                    JOptionPane.showMessageDialog(null, "No se han realizado cambios", "No hay cambios", JOptionPane.INFORMATION_MESSAGE);
                }
            }else{
                JOptionPane.showMessageDialog(null, "Debe haber un docente y un año seleccionados", "ERROR", JOptionPane.ERROR_MESSAGE);
            }
        }
        Animador.detenerAnimacion();        
    }//fin de accionAceptar

    @Action
    public void accionCancelar() {
        Animador.animar();
        this.limpiarCampos();
        this.volverConsultar();
        Animador.detenerAnimacion();
    }//fin de accionCancelar

    @Action
    public void agregarUno(){
        if(!this.listSeccionesDisponibles.isSelectionEmpty()){
            int[] indices = this.listSeccionesDisponibles.getSelectedIndices();
            if(indices.length > 0){
                for(int i = indices.length - 1; i>= 0; i--){
                    Seccion seccion = this.seccionesDisponibles.get(indices[i]);
                    String numSeccion = Integer.toString(seccion.getSeccion());
                    this.seccionesImpartir.add(seccion);
                    ((DefaultListModel)listSeccionesImpartir.getModel()).addElement(numSeccion);
                    seccionesDisponibles.remove(indices[i]);
                    ((DefaultListModel)listSeccionesDisponibles.getModel()).remove(indices[i]);
                }
            }
        }
    }//fin de agregarUno

    @Action
    public void removerUno(){
        if(!this.listSeccionesImpartir.isSelectionEmpty()){
            int[] indices = this.listSeccionesImpartir.getSelectedIndices();
            if(indices.length > 0){
                for(int i = indices.length - 1; i>= 0; i--){
                    Seccion seccion = this.seccionesImpartir.get(indices[i]);
                    String numSeccion = Integer.toString(seccion.getSeccion());
                    seccionesDisponibles.add(seccion);
                    ((DefaultListModel)listSeccionesDisponibles.getModel()).addElement(numSeccion);
                    seccionesImpartir.remove(indices[i]);
                    ((DefaultListModel)listSeccionesImpartir.getModel()).remove(indices[i]);
                }
            }
        }
    }//fin de removerUno

    @Action
    public void agregarTodos(){
        Iterator<Seccion> iterador = this.seccionesDisponibles.iterator();
        while(iterador.hasNext()){
            Seccion seccion = iterador.next();
            String numSeccion = Integer.toString(seccion.getSeccion());
            this.seccionesImpartir.add(seccion);
            ((DefaultListModel)listSeccionesImpartir.getModel()).addElement(numSeccion);
            ((DefaultListModel)listSeccionesDisponibles.getModel()).removeElement(numSeccion);
            iterador.remove();
        }
    }//fin de agregarTodos

    @Action
    public void removerTodos(){
        Iterator<Seccion> iterador = this.seccionesImpartir.iterator();
        while(iterador.hasNext()){
            Seccion seccion = iterador.next();
            String numSeccion = Integer.toString(seccion.getSeccion());
            this.seccionesDisponibles.add(seccion);
            ((DefaultListModel)listSeccionesDisponibles.getModel()).addElement(numSeccion);
            ((DefaultListModel)listSeccionesImpartir.getModel()).removeElement(numSeccion);
            iterador.remove();
        }
    }//fin de removerTodos

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        lbDocente = new javax.swing.JLabel();
        btnCancelar = new javax.swing.JButton();
        btnAceptar = new javax.swing.JButton();
        btnActualizar = new javax.swing.JButton();
        btnEliminar = new javax.swing.JButton();
        cbCedula = new javax.swing.JComboBox();
        cbNombreApellidos = new javax.swing.JComboBox();
        panelMaterias = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        cbMaterias = new javax.swing.JComboBox();
        scrollSeccionesDisponibles = new javax.swing.JScrollPane();
        listSeccionesDisponibles = new javax.swing.JList(new DefaultListModel());
        btnImpartirUna = new javax.swing.JButton();
        btnNoImpartirUna = new javax.swing.JButton();
        btnImpartirTodas = new javax.swing.JButton();
        btnImpartirNinguna = new javax.swing.JButton();
        lbNivel = new javax.swing.JLabel();
        cbNivel = new javax.swing.JComboBox();
        scrollSeccionesImpartidas = new javax.swing.JScrollPane();
        listSeccionesImpartir = new javax.swing.JList(new DefaultListModel());
        lbAño = new javax.swing.JLabel();
        cbAño = new javax.swing.JComboBox();
        jScrollPane1 = new javax.swing.JScrollPane();
        gridMateriasSeccionesImpartir = new javax.swing.JTable();
        btnBorrarSeleccionados = new javax.swing.JButton();
        btnAgregarGrid = new javax.swing.JButton();

        setMinimumSize(new java.awt.Dimension(660, 560));
        setName("Form"); // NOI18N
        setPreferredSize(new java.awt.Dimension(660, 560));

        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(adsec.presentacion.LiceoEscazuApp.class).getContext().getResourceMap(PanelDocenteImparte.class);
        lbDocente.setText(resourceMap.getString("lbDocente.text")); // NOI18N
        lbDocente.setName("lbDocente"); // NOI18N

        javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(adsec.presentacion.LiceoEscazuApp.class).getContext().getActionMap(PanelDocenteImparte.class, this);
        btnCancelar.setAction(actionMap.get("accionCancelar")); // NOI18N
        btnCancelar.setText(resourceMap.getString("btnCancelar.text")); // NOI18N
        btnCancelar.setName("btnCancelar"); // NOI18N

        btnAceptar.setAction(actionMap.get("accionAceptar")); // NOI18N
        btnAceptar.setText(resourceMap.getString("btnAceptar.text")); // NOI18N
        btnAceptar.setName("btnAceptar"); // NOI18N

        btnActualizar.setAction(actionMap.get("actualizandoMateria")); // NOI18N
        btnActualizar.setText(resourceMap.getString("btnActualizar.text")); // NOI18N
        btnActualizar.setName("btnActualizar"); // NOI18N

        btnEliminar.setAction(actionMap.get("eliminandoMateria")); // NOI18N
        btnEliminar.setText(resourceMap.getString("btnEliminar.text")); // NOI18N
        btnEliminar.setName("btnEliminar"); // NOI18N

        cbCedula.setName("cbCedula"); // NOI18N

        cbNombreApellidos.setName("cbNombreApellidos"); // NOI18N

        panelMaterias.setBorder(javax.swing.BorderFactory.createTitledBorder(resourceMap.getString("panelMaterias.border.title"))); // NOI18N
        panelMaterias.setName("panelMaterias"); // NOI18N

        jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N
        jLabel1.setName("jLabel1"); // NOI18N

        cbMaterias.setName("cbMaterias"); // NOI18N

        scrollSeccionesDisponibles.setBorder(javax.swing.BorderFactory.createTitledBorder(resourceMap.getString("scrollSeccionesDisponibles.border.title"))); // NOI18N
        scrollSeccionesDisponibles.setName("scrollSeccionesDisponibles"); // NOI18N

        listSeccionesDisponibles.setName("listSeccionesDisponibles"); // NOI18N
        scrollSeccionesDisponibles.setViewportView(listSeccionesDisponibles);

        btnImpartirUna.setAction(actionMap.get("agregarUno")); // NOI18N
        btnImpartirUna.setText(resourceMap.getString("btnImpartirUna.text")); // NOI18N
        btnImpartirUna.setName("btnImpartirUna"); // NOI18N

        btnNoImpartirUna.setAction(actionMap.get("removerUno")); // NOI18N
        btnNoImpartirUna.setText(resourceMap.getString("btnNoImpartirUna.text")); // NOI18N
        btnNoImpartirUna.setName("btnNoImpartirUna"); // NOI18N

        btnImpartirTodas.setAction(actionMap.get("agregarTodos")); // NOI18N
        btnImpartirTodas.setText(resourceMap.getString("btnImpartirTodas.text")); // NOI18N
        btnImpartirTodas.setName("btnImpartirTodas"); // NOI18N

        btnImpartirNinguna.setAction(actionMap.get("removerTodos")); // NOI18N
        btnImpartirNinguna.setText(resourceMap.getString("btnImpartirNinguna.text")); // NOI18N
        btnImpartirNinguna.setName("btnImpartirNinguna"); // NOI18N

        lbNivel.setText(resourceMap.getString("lbNivel.text")); // NOI18N
        lbNivel.setName("lbNivel"); // NOI18N

        cbNivel.setName("cbNivel"); // NOI18N

        scrollSeccionesImpartidas.setBorder(javax.swing.BorderFactory.createTitledBorder(resourceMap.getString("scrollSeccionesImpartidas.border.title"))); // NOI18N
        scrollSeccionesImpartidas.setName("scrollSeccionesImpartidas"); // NOI18N

        listSeccionesImpartir.setName("listSeccionesImpartir"); // NOI18N
        scrollSeccionesImpartidas.setViewportView(listSeccionesImpartir);

        lbAño.setText(resourceMap.getString("lbAño.text")); // NOI18N
        lbAño.setName("lbAño"); // NOI18N

        cbAño.setName("cbAño"); // NOI18N

        jScrollPane1.setName("jScrollPane1"); // NOI18N

        gridMateriasSeccionesImpartir.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Borrar", "Nivel", "Sección", "Materia"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.Boolean.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class
            };
            boolean[] canEdit = new boolean [] {
                true, false, false, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        gridMateriasSeccionesImpartir.setColumnSelectionAllowed(true);
        gridMateriasSeccionesImpartir.setName("gridMateriasSeccionesImpartir"); // NOI18N
        jScrollPane1.setViewportView(gridMateriasSeccionesImpartir);
        gridMateriasSeccionesImpartir.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        btnBorrarSeleccionados.setAction(actionMap.get("accionBorrarGrid")); // NOI18N
        btnBorrarSeleccionados.setText(resourceMap.getString("btnBorrarSeleccionados.text")); // NOI18N
        btnBorrarSeleccionados.setName("btnBorrarSeleccionados"); // NOI18N

        btnAgregarGrid.setAction(actionMap.get("accionAgregarGrid")); // NOI18N
        btnAgregarGrid.setText(resourceMap.getString("btnAgregarGrid.text")); // NOI18N
        btnAgregarGrid.setName("btnAgregarGrid"); // NOI18N

        javax.swing.GroupLayout panelMateriasLayout = new javax.swing.GroupLayout(panelMaterias);
        panelMaterias.setLayout(panelMateriasLayout);
        panelMateriasLayout.setHorizontalGroup(
            panelMateriasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelMateriasLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelMateriasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(panelMateriasLayout.createSequentialGroup()
                        .addComponent(btnAgregarGrid)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(btnBorrarSeleccionados))
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, panelMateriasLayout.createSequentialGroup()
                        .addGroup(panelMateriasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(lbNivel, javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(jLabel1, javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(lbAño, javax.swing.GroupLayout.Alignment.TRAILING))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panelMateriasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(cbAño, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(cbNivel, javax.swing.GroupLayout.PREFERRED_SIZE, 59, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(cbMaterias, javax.swing.GroupLayout.PREFERRED_SIZE, 241, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, panelMateriasLayout.createSequentialGroup()
                        .addComponent(scrollSeccionesDisponibles, javax.swing.GroupLayout.PREFERRED_SIZE, 260, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panelMateriasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(btnImpartirNinguna, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(btnImpartirTodas, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(btnNoImpartirUna, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(btnImpartirUna, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(scrollSeccionesImpartidas, javax.swing.GroupLayout.PREFERRED_SIZE, 256, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 588, Short.MAX_VALUE))
                .addGap(26, 26, 26))
        );
        panelMateriasLayout.setVerticalGroup(
            panelMateriasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelMateriasLayout.createSequentialGroup()
                .addGroup(panelMateriasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelMateriasLayout.createSequentialGroup()
                        .addContainerGap()
                        .addGroup(panelMateriasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(lbAño)
                            .addComponent(cbAño, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panelMateriasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(lbNivel)
                            .addComponent(cbNivel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panelMateriasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jLabel1)
                            .addComponent(cbMaterias, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(17, 17, 17)
                        .addGroup(panelMateriasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(scrollSeccionesImpartidas, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(scrollSeccionesDisponibles, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(panelMateriasLayout.createSequentialGroup()
                        .addContainerGap(123, Short.MAX_VALUE)
                        .addComponent(btnImpartirUna)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnNoImpartirUna)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnImpartirTodas)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnImpartirNinguna)
                        .addGap(35, 35, 35)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelMateriasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnBorrarSeleccionados)
                    .addComponent(btnAgregarGrid))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 113, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(13, 13, 13))
        );

        this.cbNivel.addActionListener(this);
        this.cbAño.addActionListener(this);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(panelMaterias, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(lbDocente)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(cbCedula, javax.swing.GroupLayout.PREFERRED_SIZE, 129, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(cbNombreApellidos, javax.swing.GroupLayout.PREFERRED_SIZE, 330, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(btnActualizar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(btnEliminar))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(btnAceptar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnCancelar)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnEliminar)
                    .addComponent(btnActualizar))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lbDocente)
                    .addComponent(cbCedula, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(cbNombreApellidos, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addComponent(panelMaterias, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnCancelar)
                    .addComponent(btnAceptar))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        this.cbCedula.addActionListener(this);
        this.cbNombreApellidos.addActionListener(this);
    }// </editor-fold>//GEN-END:initComponents


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnAceptar;
    private javax.swing.JButton btnActualizar;
    private javax.swing.JButton btnAgregarGrid;
    private javax.swing.JButton btnBorrarSeleccionados;
    private javax.swing.JButton btnCancelar;
    private javax.swing.JButton btnEliminar;
    private javax.swing.JButton btnImpartirNinguna;
    private javax.swing.JButton btnImpartirTodas;
    private javax.swing.JButton btnImpartirUna;
    private javax.swing.JButton btnNoImpartirUna;
    private javax.swing.JComboBox cbAño;
    private javax.swing.JComboBox cbCedula;
    private javax.swing.JComboBox cbMaterias;
    private javax.swing.JComboBox cbNivel;
    private javax.swing.JComboBox cbNombreApellidos;
    private javax.swing.JTable gridMateriasSeccionesImpartir;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JLabel lbAño;
    private javax.swing.JLabel lbDocente;
    private javax.swing.JLabel lbNivel;
    private javax.swing.JList listSeccionesDisponibles;
    private javax.swing.JList listSeccionesImpartir;
    private javax.swing.JPanel panelMaterias;
    private javax.swing.JScrollPane scrollSeccionesDisponibles;
    private javax.swing.JScrollPane scrollSeccionesImpartidas;
    // End of variables declaration//GEN-END:variables

}
